/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.indicadores.facade;

import br.uniceub.fsw.arquitetura.persistencia.transacao.Transacao;
import br.uniceub.fsw.arquitetura.servico.exception.NegocioException;
import br.uniceub.fsw.indicadores.bo.ObjetivoBO;
import br.uniceub.fsw.indicadores.dao.TipoObjetivoDAO;
import br.uniceub.fsw.indicadores.vo.TipoObjetivoVO;
import br.uniceub.fsw.indicadores.dao.ObjetivoDAO;
import br.uniceub.fsw.indicadores.vo.ObjetivoVO;
import br.uniceub.fsw.util.TabelaHtml;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Facade da entidade Objetivo.
 * 
 * @author Marcos Mello Nobrega Soares
 */
public class ObjetivoFacade {
    /**
     * Mensagem de retorno do sistema.
     */
    private String message;

    /**
     * Value object do objetivo.
     */
    private ObjetivoVO objetivo;
    
    /**
     * Lista de tipos de Objetivos
     */
    private List<List> tiposObjetivos;
    
    /**
     * Construtor da classe.
     */
    public ObjetivoFacade() {  
        this.tiposObjetivos = new ArrayList<List>();
        
        List<TipoObjetivoVO> tipos = new TipoObjetivoDAO().consultarPorExemplo(new TipoObjetivoVO());        
        
        for(int i = 0; i < tipos.size(); i++) {
            List<String> temp = new ArrayList<String>();
            temp.add(tipos.get(i).getIdTipoObjetivo().toString());
            temp.add(tipos.get(i).getNoTipoObjetivo().toString());
            this.tiposObjetivos.add(temp);
        }
    }
    
    /**
     * Getter da mensagem de retorno.
     * 
     * @return Mensagem de retorno.
     */
    public String getMessage() {
        String retorno = null;
        if(this.message == null || this.message.isEmpty()) {
            retorno = "&nbsp";
        } else {
            retorno = this.message;
        }
        return retorno;
    }
    
    /**
     * Retorna o objetivo.
     * 
     * @return Objeto objetivo.
     */
    public ObjetivoVO getObjetivo() {
        return this.objetivo;
    }
    
    /**
     * Retorna os Tipos de Objetivo.
     * 
     * @return Lista de Tipos de Objetivo.
     */
    public List<List> getTiposObjetivo() {
        return this.tiposObjetivos;
    }
     
    /**
     * Responsável por executar a operação selecionada pelo usuário.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void operacao(HttpServletRequest req, HttpServletResponse resp) {
        String oper = req.getParameter("operacao");

        if(oper != null)
        {
            if (oper.equals("consultar")) {
                this.consultar(req, resp);
            }
            if (oper.equals("incluir")) {
                this.incluir(req, resp);
            }
            if (oper.equals("alterar")) {
                this.alterar(req, resp);
            }
            if (oper.equals("excluir")) {
                this.excluir(req, resp);
            }
            if (oper.equals("confirmar")) {
                this.confirmar(req, resp);
            }
        }
    }
  
    
    /**
     * Consultar um objetivo.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void consultar(HttpServletRequest req, HttpServletResponse resp) {
        String idObjetivoTmp = req.getParameter("idObjetivo");
        
        Integer idObjetivo = null;
        
        if(idObjetivoTmp == null || idObjetivoTmp.equals("")) {
            return;
        } else {
            idObjetivo = Integer.parseInt(idObjetivoTmp);
        }
        
        this.objetivo = new ObjetivoDAO().consultarPorId(idObjetivo);
    }
    
    /**
     * Incluir um objetivo.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void incluir(HttpServletRequest req, HttpServletResponse resp) {
        String mensagem = null;

        objetivo = new ObjetivoVO();

        try {
            objetivo.setCdTipoObjetivo(Integer.parseInt(req.getParameter("cdTipoObjetivo")));
        }
        catch (NumberFormatException e) {   
        }
        
        objetivo.setNoObjetivo(req.getParameter("noObjetivo").trim());
        objetivo.setDsObjetivo(req.getParameter("dsObjetivo").trim());
        objetivo.setStObjetivoAtivo(req.getParameter("stObjetivoAtivo"));

        try {
            new ObjetivoBO().validaObjetivo(objetivo);
        }
        catch(NegocioException e) {
            mensagem = e.getMessage().replace("\n","<br />");
        }
        catch(Exception e) {
            mensagem = e.getMessage();
        }

        if(mensagem == null) {            
            try {
                Transacao.iniciar();
                new ObjetivoDAO().inserir(objetivo);
                Transacao.efetivar();
                mensagem = "Objetivo incluído com sucesso.";    
            } catch (Exception ex) {
                Transacao.desfazer();
                mensagem = "Problema na inclusão do objetivo: " + ex.getMessage();
            }
        }
        
        this.message = mensagem;
    }

    /**
     * Alterar um objetivo.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void alterar(HttpServletRequest req, HttpServletResponse resp) {
        String mensagem = null;
        
        objetivo = new ObjetivoVO();
        objetivo.setNoObjetivo(req.getParameter("noObjetivo").trim());
        objetivo.setDsObjetivo(req.getParameter("dsObjetivo").trim());
        objetivo.setStObjetivoAtivo(req.getParameter("stObjetivoAtivo"));
        
        try {
            objetivo.setCdTipoObjetivo(Integer.parseInt(req.getParameter("cdTipoObjetivo")));
        }
        catch (NumberFormatException e) {
        }
        
        try {
            objetivo.setIdObjetivo(Integer.parseInt(req.getParameter("idObjetivo")));
        }
        catch (NumberFormatException e) {
        }        
      
        try {
            new ObjetivoBO().validaObjetivo(objetivo);
        }
        catch(NegocioException e) {
            mensagem = e.getMessage().replace("\n","<br />");
        }
        catch(Exception e) {
            mensagem = e.getMessage();
        }
        
        if(mensagem == null) {            
            try {
                Transacao.iniciar();
                new ObjetivoDAO().alterar(objetivo);
                Transacao.efetivar();
                mensagem = "Objetivo alterado com sucesso.";                
            } catch (Exception ex) {
                Transacao.desfazer();
                mensagem = "Problema na alteração do objetivo: " + ex.getMessage();
            }
        }
         
        this.message = mensagem;
    }

    /**
     * Excluir um objetivo.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void excluir(HttpServletRequest req, HttpServletResponse resp) {        
        String mensagem = null;
                
        objetivo = new ObjetivoVO();
        
        try {
            objetivo.setIdObjetivo(Integer.parseInt(req.getParameter("idObjetivo")));
        }
        catch (NumberFormatException e) {
            mensagem = "ID do objetivo inválido";
        }
        
        if(mensagem == null) {
            try {
                new ObjetivoBO().validaExclusão(objetivo);
                Transacao.iniciar();
                
                new ObjetivoDAO().excluir(objetivo);
                
                Transacao.efetivar();
                mensagem = "Objetivo excluído com sucesso.";
            }            
            catch (NegocioException ex) {
                mensagem = "Problema na exclusão do objetivo: " + ex.getMessage();
            }
            catch (Exception ex) {
                Transacao.desfazer();
                mensagem = "Problema na exclusão do objetivo: " + ex.getMessage();
            }
        }
        
        this.objetivo = null;
        
        this.message = mensagem;
    }
    
    /**
     * Confirmar a exclusão do objetivo.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void confirmar(HttpServletRequest req, HttpServletResponse resp) {
        String mensagem = null; 

        objetivo = new ObjetivoVO();
        
        try {
            objetivo.setIdObjetivo(Integer.parseInt(req.getParameter("idObjetivo")));            
        }
        catch(NumberFormatException e) {
            objetivo = null;
            mensagem = "ID do Objetivo desconhecido";
        }
        
        if(objetivo != null) {            
            try {
                new ObjetivoBO().validaExclusão(objetivo);               
            }
            catch (NegocioException ex) {
                mensagem = ex.getMessage();
                objetivo = null;
            }
            catch (Exception ex) {
                mensagem = "Problemas na excludão do objetivo: " + ex.getMessage();
                objetivo = null;
            }
            
            if(mensagem == null) {
                objetivo.setNoObjetivo(req.getParameter("noObjetivo"));
                objetivo.setDsObjetivo(req.getParameter("dsObjetivo"));
            }
            
            this.message = mensagem;
        }
    }

    /**
     * Retorna uma lista de objetivos a partir de parâmetros da tela
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     * @return objeto tabela com as informações necessárias
     */
    public TabelaHtml consultarObjetivos(HttpServletRequest req, HttpServletResponse resp) {
        String nome = req.getParameter("noObjetivo");
        String ativo = req.getParameter("stObjetivoAtivo");
        
        if(nome != null) {
            TabelaHtml tabela = new TabelaHtml();
            
            tabela.setCampoRetorno("idObjetivo");
            
            tabela.adicionarTitulo("Id");
            tabela.adicionarTamanho(0);
            tabela.adicionarTipo("Integer");
            tabela.adicionarStatus(false);

            tabela.adicionarTitulo("Nome");
            tabela.adicionarTamanho(60);
            tabela.adicionarTipo("String");
            tabela.adicionarStatus(true);
            
            tabela.adicionarTitulo("Tipo");
            tabela.adicionarTamanho(20);
            tabela.adicionarTipo("String");
            tabela.adicionarStatus(true);
            
            tabela.adicionarTitulo("Descrição");
            tabela.adicionarTamanho(0);
            tabela.adicionarTipo("String");
            tabela.adicionarStatus(false);
            
            tabela.gravarCampos();
            
            // Lista de objetivos
           
            ObjetivoVO exemplo = new ObjetivoVO();
            if(!nome.isEmpty())
                exemplo.setNoObjetivo(nome);
             if(ativo != null && !ativo.isEmpty())
                exemplo.setStObjetivoAtivo("S");
            List<ObjetivoVO> objetivos = new ObjetivoDAO().consultarPorExemplo(exemplo);
            
            // Adiciona os valores de cada objetivo nas listas de ids e nomes
            for(int i = 0; i < objetivos.size(); i++) {
                tabela.adicionarRegistro(converterVoParaString(objetivos.get(i)));
            }

            return tabela;
        }
        
        return null;
    }
    
    /**
     * Transforma os campos de um VO em uma lista de Strings
     * 
     * @return lista de strings com os valores em ordem
     */
    public List<String> converterVoParaString(ObjetivoVO objetivo) {
        List<String> valores = new ArrayList<String>();
        
        valores.add(objetivo.getIdObjetivo().toString());
        valores.add(objetivo.getNoObjetivo());
        valores.add(objetivo.getTipoObjetivo().getNoTipoObjetivo());
        valores.add(objetivo.getDsObjetivo());
        
        return valores;
    }
}